1 module eastasianwidth.eastasianwidth;
2 
3 /// East_Asian_Width property
4 enum EastAsianWidthProperty {
5     A, F, H, N, Na, W
6 }
7 
8 /// returns East_Asian_Width property of a character
9 EastAsianWidthProperty eastAsianWidth(dchar ch) @safe pure @nogc nothrow {
10     const uint codePoint =  ch;
11     if ((codePoint == 12288) ||
12         (65281 <= codePoint && codePoint <= 65376) ||
13         (65504 <= codePoint && codePoint <= 65510)) return EastAsianWidthProperty.F;
14     if ((codePoint == 8361) ||
15         (65377 <= codePoint && codePoint <= 65470) ||
16         (65474 <= codePoint && codePoint <= 65479) ||
17         (65482 <= codePoint && codePoint <= 65487) ||
18         (65490 <= codePoint && codePoint <= 65495) ||
19         (65498 <= codePoint && codePoint <= 65500) ||
20         (65512 <= codePoint && codePoint <= 65518)) return EastAsianWidthProperty.H;
21     if ((4352 <= codePoint && codePoint <= 4447) ||
22         (8986 <= codePoint && codePoint <= 8987) ||
23         (9001 <= codePoint && codePoint <= 9002) ||
24         (9193 <= codePoint && codePoint <= 9196) ||
25         (codePoint == 9200) ||
26         (codePoint == 9203) ||
27         (9725 <= codePoint && codePoint <= 9726) ||
28         (9748 <= codePoint && codePoint <= 9749) ||
29         (9800 <= codePoint && codePoint <= 9811) ||
30         (codePoint == 9855) ||
31         (codePoint == 9875) ||
32         (codePoint == 9889) ||
33         (9898 <= codePoint && codePoint <= 9899) ||
34         (9917 <= codePoint && codePoint <= 9918) ||
35         (9924 <= codePoint && codePoint <= 9925) ||
36         (codePoint == 9934) ||
37         (codePoint == 9940) ||
38         (codePoint == 9962) ||
39         (9970 <= codePoint && codePoint <= 9971) ||
40         (codePoint == 9973) ||
41         (codePoint == 9978) ||
42         (codePoint == 9981) ||
43         (codePoint == 9989) ||
44         (9994 <= codePoint && codePoint <= 9995) ||
45         (codePoint == 10024) ||
46         (codePoint == 10060) ||
47         (codePoint == 10062) ||
48         (10067 <= codePoint && codePoint <= 10069) ||
49         (codePoint == 10071) ||
50         (10133 <= codePoint && codePoint <= 10135) ||
51         (codePoint == 10160) ||
52         (codePoint == 10175) ||
53         (11035 <= codePoint && codePoint <= 11036) ||
54         (codePoint == 11088) ||
55         (codePoint == 11093) ||
56         (11904 <= codePoint && codePoint <= 11929) ||
57         (11931 <= codePoint && codePoint <= 12019) ||
58         (12032 <= codePoint && codePoint <= 12245) ||
59         (12272 <= codePoint && codePoint <= 12283) ||
60         (12289 <= codePoint && codePoint <= 12350) ||
61         (12353 <= codePoint && codePoint <= 12438) ||
62         (12441 <= codePoint && codePoint <= 12543) ||
63         (12549 <= codePoint && codePoint <= 12589) ||
64         (12593 <= codePoint && codePoint <= 12686) ||
65         (12688 <= codePoint && codePoint <= 12730) ||
66         (12736 <= codePoint && codePoint <= 12771) ||
67         (12784 <= codePoint && codePoint <= 12830) ||
68         (12832 <= codePoint && codePoint <= 12871) ||
69         (12880 <= codePoint && codePoint <= 13054) ||
70         (13056 <= codePoint && codePoint <= 19903) ||
71         (19968 <= codePoint && codePoint <= 42124) ||
72         (42128 <= codePoint && codePoint <= 42182) ||
73         (43360 <= codePoint && codePoint <= 43388) ||
74         (44032 <= codePoint && codePoint <= 55203) ||
75         (63744 <= codePoint && codePoint <= 64255) ||
76         (65040 <= codePoint && codePoint <= 65049) ||
77         (65072 <= codePoint && codePoint <= 65106) ||
78         (65108 <= codePoint && codePoint <= 65126) ||
79         (65128 <= codePoint && codePoint <= 65131) ||
80         (codePoint == 94176) ||
81         (94208 <= codePoint && codePoint <= 100332) ||
82         (100352 <= codePoint && codePoint <= 101106) ||
83         (110592 <= codePoint && codePoint <= 110593) ||
84         (codePoint == 126980) ||
85         (codePoint == 127183) ||
86         (codePoint == 127374) ||
87         (127377 <= codePoint && codePoint <= 127386) ||
88         (127488 <= codePoint && codePoint <= 127490) ||
89         (127504 <= codePoint && codePoint <= 127547) ||
90         (127552 <= codePoint && codePoint <= 127560) ||
91         (127568 <= codePoint && codePoint <= 127569) ||
92         (127744 <= codePoint && codePoint <= 127776) ||
93         (127789 <= codePoint && codePoint <= 127797) ||
94         (127799 <= codePoint && codePoint <= 127868) ||
95         (127870 <= codePoint && codePoint <= 127891) ||
96         (127904 <= codePoint && codePoint <= 127946) ||
97         (127951 <= codePoint && codePoint <= 127955) ||
98         (127968 <= codePoint && codePoint <= 127984) ||
99         (codePoint == 127988) ||
100         (127992 <= codePoint && codePoint <= 128062) ||
101         (codePoint == 128064) ||
102         (128066 <= codePoint && codePoint <= 128252) ||
103         (128255 <= codePoint && codePoint <= 128317) ||
104         (128331 <= codePoint && codePoint <= 128334) ||
105         (128336 <= codePoint && codePoint <= 128359) ||
106         (codePoint == 128378) ||
107         (128405 <= codePoint && codePoint <= 128406) ||
108         (codePoint == 128420) ||
109         (128507 <= codePoint && codePoint <= 128591) ||
110         (128640 <= codePoint && codePoint <= 128709) ||
111         (codePoint == 128716) ||
112         (128720 <= codePoint && codePoint <= 128722) ||
113         (128747 <= codePoint && codePoint <= 128748) ||
114         (128756 <= codePoint && codePoint <= 128758) ||
115         (129296 <= codePoint && codePoint <= 129310) ||
116         (129312 <= codePoint && codePoint <= 129319) ||
117         (codePoint == 129328) ||
118         (129331 <= codePoint && codePoint <= 129342) ||
119         (129344 <= codePoint && codePoint <= 129355) ||
120         (129360 <= codePoint && codePoint <= 129374) ||
121         (129408 <= codePoint && codePoint <= 129425) ||
122         (codePoint == 129472) ||
123         (131072 <= codePoint && codePoint <= 196605) ||
124         (196608 <= codePoint && codePoint <= 262141)) return EastAsianWidthProperty.W;
125     if ((32 <= codePoint && codePoint <= 126) ||
126         (162 <= codePoint && codePoint <= 163) ||
127         (165 <= codePoint && codePoint <= 166) ||
128         (codePoint == 172) ||
129         (codePoint == 175) ||
130         (10214 <= codePoint && codePoint <= 10221) ||
131         (10629 <= codePoint && codePoint <= 10630)) return EastAsianWidthProperty.Na;
132     if ((codePoint == 161) ||
133         (codePoint == 164) ||
134         (167 <= codePoint && codePoint <= 168) ||
135         (codePoint == 170) ||
136         (173 <= codePoint && codePoint <= 174) ||
137         (176 <= codePoint && codePoint <= 180) ||
138         (182 <= codePoint && codePoint <= 186) ||
139         (188 <= codePoint && codePoint <= 191) ||
140         (codePoint == 198) ||
141         (codePoint == 208) ||
142         (215 <= codePoint && codePoint <= 216) ||
143         (222 <= codePoint && codePoint <= 225) ||
144         (codePoint == 230) ||
145         (232 <= codePoint && codePoint <= 234) ||
146         (236 <= codePoint && codePoint <= 237) ||
147         (codePoint == 240) ||
148         (242 <= codePoint && codePoint <= 243) ||
149         (247 <= codePoint && codePoint <= 250) ||
150         (codePoint == 252) ||
151         (codePoint == 254) ||
152         (codePoint == 257) ||
153         (codePoint == 273) ||
154         (codePoint == 275) ||
155         (codePoint == 283) ||
156         (294 <= codePoint && codePoint <= 295) ||
157         (codePoint == 299) ||
158         (305 <= codePoint && codePoint <= 307) ||
159         (codePoint == 312) ||
160         (319 <= codePoint && codePoint <= 322) ||
161         (codePoint == 324) ||
162         (328 <= codePoint && codePoint <= 331) ||
163         (codePoint == 333) ||
164         (338 <= codePoint && codePoint <= 339) ||
165         (358 <= codePoint && codePoint <= 359) ||
166         (codePoint == 363) ||
167         (codePoint == 462) ||
168         (codePoint == 464) ||
169         (codePoint == 466) ||
170         (codePoint == 468) ||
171         (codePoint == 470) ||
172         (codePoint == 472) ||
173         (codePoint == 474) ||
174         (codePoint == 476) ||
175         (codePoint == 593) ||
176         (codePoint == 609) ||
177         (codePoint == 708) ||
178         (codePoint == 711) ||
179         (713 <= codePoint && codePoint <= 715) ||
180         (codePoint == 717) ||
181         (codePoint == 720) ||
182         (728 <= codePoint && codePoint <= 731) ||
183         (codePoint == 733) ||
184         (codePoint == 735) ||
185         (768 <= codePoint && codePoint <= 879) ||
186         (913 <= codePoint && codePoint <= 929) ||
187         (931 <= codePoint && codePoint <= 937) ||
188         (945 <= codePoint && codePoint <= 961) ||
189         (963 <= codePoint && codePoint <= 969) ||
190         (codePoint == 1025) ||
191         (1040 <= codePoint && codePoint <= 1103) ||
192         (codePoint == 1105) ||
193         (codePoint == 8208) ||
194         (8211 <= codePoint && codePoint <= 8214) ||
195         (8216 <= codePoint && codePoint <= 8217) ||
196         (8220 <= codePoint && codePoint <= 8221) ||
197         (8224 <= codePoint && codePoint <= 8226) ||
198         (8228 <= codePoint && codePoint <= 8231) ||
199         (codePoint == 8240) ||
200         (8242 <= codePoint && codePoint <= 8243) ||
201         (codePoint == 8245) ||
202         (codePoint == 8251) ||
203         (codePoint == 8254) ||
204         (codePoint == 8308) ||
205         (codePoint == 8319) ||
206         (8321 <= codePoint && codePoint <= 8324) ||
207         (codePoint == 8364) ||
208         (codePoint == 8451) ||
209         (codePoint == 8453) ||
210         (codePoint == 8457) ||
211         (codePoint == 8467) ||
212         (codePoint == 8470) ||
213         (8481 <= codePoint && codePoint <= 8482) ||
214         (codePoint == 8486) ||
215         (codePoint == 8491) ||
216         (8531 <= codePoint && codePoint <= 8532) ||
217         (8539 <= codePoint && codePoint <= 8542) ||
218         (8544 <= codePoint && codePoint <= 8555) ||
219         (8560 <= codePoint && codePoint <= 8569) ||
220         (codePoint == 8585) ||
221         (8592 <= codePoint && codePoint <= 8601) ||
222         (8632 <= codePoint && codePoint <= 8633) ||
223         (codePoint == 8658) ||
224         (codePoint == 8660) ||
225         (codePoint == 8679) ||
226         (codePoint == 8704) ||
227         (8706 <= codePoint && codePoint <= 8707) ||
228         (8711 <= codePoint && codePoint <= 8712) ||
229         (codePoint == 8715) ||
230         (codePoint == 8719) ||
231         (codePoint == 8721) ||
232         (codePoint == 8725) ||
233         (codePoint == 8730) ||
234         (8733 <= codePoint && codePoint <= 8736) ||
235         (codePoint == 8739) ||
236         (codePoint == 8741) ||
237         (8743 <= codePoint && codePoint <= 8748) ||
238         (codePoint == 8750) ||
239         (8756 <= codePoint && codePoint <= 8759) ||
240         (8764 <= codePoint && codePoint <= 8765) ||
241         (codePoint == 8776) ||
242         (codePoint == 8780) ||
243         (codePoint == 8786) ||
244         (8800 <= codePoint && codePoint <= 8801) ||
245         (8804 <= codePoint && codePoint <= 8807) ||
246         (8810 <= codePoint && codePoint <= 8811) ||
247         (8814 <= codePoint && codePoint <= 8815) ||
248         (8834 <= codePoint && codePoint <= 8835) ||
249         (8838 <= codePoint && codePoint <= 8839) ||
250         (codePoint == 8853) ||
251         (codePoint == 8857) ||
252         (codePoint == 8869) ||
253         (codePoint == 8895) ||
254         (codePoint == 8978) ||
255         (9312 <= codePoint && codePoint <= 9449) ||
256         (9451 <= codePoint && codePoint <= 9547) ||
257         (9552 <= codePoint && codePoint <= 9587) ||
258         (9600 <= codePoint && codePoint <= 9615) ||
259         (9618 <= codePoint && codePoint <= 9621) ||
260         (9632 <= codePoint && codePoint <= 9633) ||
261         (9635 <= codePoint && codePoint <= 9641) ||
262         (9650 <= codePoint && codePoint <= 9651) ||
263         (9654 <= codePoint && codePoint <= 9655) ||
264         (9660 <= codePoint && codePoint <= 9661) ||
265         (9664 <= codePoint && codePoint <= 9665) ||
266         (9670 <= codePoint && codePoint <= 9672) ||
267         (codePoint == 9675) ||
268         (9678 <= codePoint && codePoint <= 9681) ||
269         (9698 <= codePoint && codePoint <= 9701) ||
270         (codePoint == 9711) ||
271         (9733 <= codePoint && codePoint <= 9734) ||
272         (codePoint == 9737) ||
273         (9742 <= codePoint && codePoint <= 9743) ||
274         (codePoint == 9756) ||
275         (codePoint == 9758) ||
276         (codePoint == 9792) ||
277         (codePoint == 9794) ||
278         (9824 <= codePoint && codePoint <= 9825) ||
279         (9827 <= codePoint && codePoint <= 9829) ||
280         (9831 <= codePoint && codePoint <= 9834) ||
281         (9836 <= codePoint && codePoint <= 9837) ||
282         (codePoint == 9839) ||
283         (9886 <= codePoint && codePoint <= 9887) ||
284         (codePoint == 9919) ||
285         (9926 <= codePoint && codePoint <= 9933) ||
286         (9935 <= codePoint && codePoint <= 9939) ||
287         (9941 <= codePoint && codePoint <= 9953) ||
288         (codePoint == 9955) ||
289         (9960 <= codePoint && codePoint <= 9961) ||
290         (9963 <= codePoint && codePoint <= 9969) ||
291         (codePoint == 9972) ||
292         (9974 <= codePoint && codePoint <= 9977) ||
293         (9979 <= codePoint && codePoint <= 9980) ||
294         (9982 <= codePoint && codePoint <= 9983) ||
295         (codePoint == 10045) ||
296         (10102 <= codePoint && codePoint <= 10111) ||
297         (11094 <= codePoint && codePoint <= 11097) ||
298         (12872 <= codePoint && codePoint <= 12879) ||
299         (57344 <= codePoint && codePoint <= 63743) ||
300         (65024 <= codePoint && codePoint <= 65039) ||
301         (codePoint == 65533) ||
302         (127232 <= codePoint && codePoint <= 127242) ||
303         (127248 <= codePoint && codePoint <= 127277) ||
304         (127280 <= codePoint && codePoint <= 127337) ||
305         (127344 <= codePoint && codePoint <= 127373) ||
306         (127375 <= codePoint && codePoint <= 127376) ||
307         (127387 <= codePoint && codePoint <= 127404) ||
308         (917760 <= codePoint && codePoint <= 917999) ||
309         (983040 <= codePoint && codePoint <= 1048573) ||
310         (1048576 <= codePoint && codePoint <= 1114109)) return EastAsianWidthProperty.A;
311     return EastAsianWidthProperty.N;
312 }